package tool

import (
	"crypto/rand"
	"crypto/rsa"
	"crypto/x509"
	"encoding/pem"
	"errors"
	"fmt"
)

// EncryptPKCS1v15 使用RSA公钥加密数据（PKCS#1 v1.5填充）
// 例如：EncryptPKCS1v15([]byte("-----BEGIN PUBLIC KEY-----\n"+pub+"\n-----END PUBLIC KEY-----"), "加密文本")
func RSAEncryptPKCS1v15(publicKeyPEM []byte, plaintext []byte) ([]byte, error) {
	// 解析PEM格式的公钥
	block, _ := pem.Decode(publicKeyPEM)
	if block == nil {
		return nil, errors.New("failed to parse PEM block containing the public key")
	}

	// 解析公钥
	pub, err := x509.ParsePKIXPublicKey(block.Bytes)
	if err != nil {
		return nil, fmt.Errorf("failed to parse DER encoded public key: %v", err)
	}

	rsaPub, ok := pub.(*rsa.PublicKey)
	if !ok {
		return nil, errors.New("key is not an RSA public key")
	}

	// 加密数据（使用PKCS#1 v1.5填充）
	// 注意：plaintext长度必须 <= 密钥长度-11字节（填充开销）
	ciphertext, err := rsa.EncryptPKCS1v15(rand.Reader, rsaPub, plaintext)
	if err != nil {
		return nil, fmt.Errorf("encryption error: %v", err)
	}

	return ciphertext, nil
}

// DecryptPKCS1v15 使用RSA私钥解密数据（PKCS#1 v1.5填充）
// privateKey := `-----BEGIN RSA PRIVATE KEY-----
// （你的私钥）
// -----END RSA PRIVATE KEY-----`
func RSADecryptPKCS1v15(privateKeyPEM []byte, ciphertext []byte) ([]byte, error) {
	// 解析PEM格式的私钥
	block, _ := pem.Decode(privateKeyPEM)
	if block == nil {
		return nil, errors.New("failed to parse PEM block containing the private key")
	}

	// 解析私钥（支持PKCS#1和PKCS#8格式）
	priv, err := x509.ParsePKCS1PrivateKey(block.Bytes)
	if err != nil {
		// 尝试PKCS#8格式
		key, err := x509.ParsePKCS8PrivateKey(block.Bytes)
		if err != nil {
			return nil, fmt.Errorf("failed to parse private key: %v", err)
		}

		// 修复：直接使用key变量，不需要再赋值给priv
		rsaPriv, ok := key.(*rsa.PrivateKey)
		if !ok {
			return nil, errors.New("key is not an RSA private key")
		}
		priv = rsaPriv // 将转换后的密钥赋给priv变量
	}

	// 解密数据（使用PKCS#1 v1.5填充）
	plaintext, err := rsa.DecryptPKCS1v15(rand.Reader, priv, ciphertext)
	if err != nil {
		return nil, fmt.Errorf("decryption error: %v", err)
	}

	return plaintext, nil
}
